#include "spi_bus.h"
#include "../../User/BSP/GPIO_BSP/gpio_bsp.h"


WHT_SPI_BUS_t* WHT_SPI_BUS1;//总线1
WHT_SPI_BUS_t* WHT_SPI_BUS2;//总线2
WHT_SPI_BUS_t* WHT_SPI_BUS3;//总线3
WHT_SPI_BUS_t* WHT_SPI_BUS4;//总线4
WHT_SPI_BUS_t* WHT_SPI_BUS5;//总线5
WHT_SPI_BUS_t* WHT_SPI_BUS6;//总线6

static const WHT_SPI_BUS_Config_t WHT_SPI_BUS_Config = WHT_SPI_BUS_CONFIG_DEFAULT;


static void WHT_SPI_BUS1_GPIO_Init_Callback(void)
{
	WHT_GPIO_BSP.WHT_Set_Clock(PortA, ENABLE);
	WHT_GPIO_BSP.WHT_Set_Pin(PortA, Pin5 | Pin6 | Pin7, Hig);
	WHT_GPIO_BSP.WHT_Set_Mode(PortA, Pin5 | Pin6| Pin7, Mode_AF_PP);

	if (WHT_SPI_BUS_Config.NSS == Hard_NSS)//GPIO_CS_NSS
	{
		WHT_GPIO_BSP.WHT_Set_Pin(PortA, Pin4, Hig);
		WHT_GPIO_BSP.WHT_Set_Mode(PortA, Pin4, Mode_AF_PP);
		WHT_GPIO_BSP.WHT_Set_AFIO(PortA, Pin4, AFIO_SPI0);
	}

	WHT_GPIO_BSP.WHT_Set_AFIO(PortA, Pin5, AFIO_SPI0);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortA, Pin6, AFIO_SPI0);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortA, Pin7, AFIO_SPI0);
}
static void WHT_SPI_BUS2_GPIO_Init_Callback(void)
{
	WHT_GPIO_BSP.WHT_Set_Clock(PortB, ENABLE);
	WHT_GPIO_BSP.WHT_Set_Pin(PortB, Pin13 | Pin14 | Pin15, Hig);
	WHT_GPIO_BSP.WHT_Set_Mode(PortB, Pin13 | Pin14| Pin15, Mode_AF_PP);

	if (WHT_SPI_BUS_Config.NSS == Hard_NSS)//GPIO_CS_NSS
	{
		WHT_GPIO_BSP.WHT_Set_Pin(PortB, Pin12, Hig);
		WHT_GPIO_BSP.WHT_Set_Mode(PortB, Pin12, Mode_AF_PP);
		WHT_GPIO_BSP.WHT_Set_AFIO(PortB, Pin12, AFIO_SPI1);
	}

	WHT_GPIO_BSP.WHT_Set_AFIO(PortB, Pin13, AFIO_SPI1);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortB, Pin14, AFIO_SPI1);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortB, Pin15, AFIO_SPI1);
}
static void WHT_SPI_BUS3_GPIO_Init_Callback(void)
{
	WHT_GPIO_BSP.WHT_Set_Clock(PortB, ENABLE);
	WHT_GPIO_BSP.WHT_Set_Pin(PortB, Pin3 | Pin4 | Pin5, Hig);
	WHT_GPIO_BSP.WHT_Set_Mode(PortB, Pin3 | Pin4| Pin5, Mode_AF_PP);

	if (WHT_SPI_BUS_Config.NSS == Hard_NSS)//GPIO_CS_NSS
	{
		WHT_GPIO_BSP.WHT_Set_Clock(PortA, ENABLE);
		WHT_GPIO_BSP.WHT_Set_Pin(PortA, Pin15, Hig);
		WHT_GPIO_BSP.WHT_Set_Mode(PortA, Pin15, Mode_AF_PP);
		WHT_GPIO_BSP.WHT_Set_AFIO(PortA, Pin15, AFIO_SPI2);
	}

	WHT_GPIO_BSP.WHT_Set_AFIO(PortB, Pin3, AFIO_SPI2);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortB, Pin4, AFIO_SPI2);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortB, Pin5, AFIO_SPI2);
}
static void WHT_SPI_BUS4_GPIO_Init_Callback(void)
{
	WHT_GPIO_BSP.WHT_Set_Clock(PortE, ENABLE);
	WHT_GPIO_BSP.WHT_Set_Pin(PortE, Pin12 | Pin13 | Pin14, Hig);
	WHT_GPIO_BSP.WHT_Set_Mode(PortE, Pin12 | Pin13| Pin14, Mode_AF_PP);

	if (WHT_SPI_BUS_Config.NSS == Hard_NSS)//GPIO_CS_NSS
	{
		WHT_GPIO_BSP.WHT_Set_Clock(PortE, ENABLE);
		WHT_GPIO_BSP.WHT_Set_Pin(PortE, Pin11, Hig);
		WHT_GPIO_BSP.WHT_Set_Mode(PortE, Pin11, Mode_AF_PP);
		WHT_GPIO_BSP.WHT_Set_AFIO(PortE, Pin11, AFIO_SPI3);
	}

	WHT_GPIO_BSP.WHT_Set_AFIO(PortE, Pin12, AFIO_SPI3);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortE, Pin13, AFIO_SPI3);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortE, Pin14, AFIO_SPI3);
}
static void WHT_SPI_BUS5_GPIO_Init_Callback(void)
{
	WHT_GPIO_BSP.WHT_Set_Clock(PortF, ENABLE);
	WHT_GPIO_BSP.WHT_Set_Pin(PortF, Pin7 | Pin8 | Pin9, Hig);
	WHT_GPIO_BSP.WHT_Set_Mode(PortF, Pin7 | Pin8| Pin9, Mode_AF_PP);

	if (WHT_SPI_BUS_Config.NSS == Hard_NSS)//GPIO_CS_NSS
	{
		WHT_GPIO_BSP.WHT_Set_Clock(PortF, ENABLE);
		WHT_GPIO_BSP.WHT_Set_Pin(PortF, Pin6, Hig);
		WHT_GPIO_BSP.WHT_Set_Mode(PortF, Pin6, Mode_AF_PP);
		WHT_GPIO_BSP.WHT_Set_AFIO(PortF, Pin6, AFIO_SPI4);
	}

	WHT_GPIO_BSP.WHT_Set_AFIO(PortF, Pin7, AFIO_SPI4);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortF, Pin8, AFIO_SPI4);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortF, Pin9, AFIO_SPI4);
}
static void WHT_SPI_BUS6_GPIO_Init_Callback(void)
{
	WHT_GPIO_BSP.WHT_Set_Clock(PortG, ENABLE);
	WHT_GPIO_BSP.WHT_Set_Pin(PortG, Pin12 | Pin13 | Pin14, Hig);
	WHT_GPIO_BSP.WHT_Set_Mode(PortG, Pin12 | Pin13| Pin14, Mode_AF_PP);

	if (WHT_SPI_BUS_Config.NSS == Hard_NSS)//GPIO_CS_NSS
	{
		WHT_GPIO_BSP.WHT_Set_Clock(PortG, ENABLE);
		WHT_GPIO_BSP.WHT_Set_Pin(PortG, Pin8, Hig);
		WHT_GPIO_BSP.WHT_Set_Mode(PortG, Pin8, Mode_AF_PP);
		WHT_GPIO_BSP.WHT_Set_AFIO(PortG, Pin8, AFIO_SPI5);
	}

	WHT_GPIO_BSP.WHT_Set_AFIO(PortG, Pin12, AFIO_SPI5);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortG, Pin13, AFIO_SPI5);
	WHT_GPIO_BSP.WHT_Set_AFIO(PortG, Pin14, AFIO_SPI5);
}

char WHT_SPI_BUS1_Init(void)
{
    WHT_SPI_BUS1 = WHT_SPI_BUS_OPS.Register(WHT_SPI1_Name, (WHT_SPI_BUS_Config_t*)&WHT_SPI_BUS_Config, WHT_SPI_BUS1_GPIO_Init_Callback);
    return WHT_SPI_BUS1 == (void*)0 ? -1 : 0;
}
char WHT_SPI_BUS2_Init(void)
{
    WHT_SPI_BUS2 = WHT_SPI_BUS_OPS.Register(WHT_SPI2_Name, (WHT_SPI_BUS_Config_t*)&WHT_SPI_BUS_Config, WHT_SPI_BUS2_GPIO_Init_Callback);
    return WHT_SPI_BUS2 == (void*)0 ? -1 : 0;
}
char WHT_SPI_BUS3_Init(void)
{
    WHT_SPI_BUS3 = WHT_SPI_BUS_OPS.Register(WHT_SPI3_Name, (WHT_SPI_BUS_Config_t*)&WHT_SPI_BUS_Config, WHT_SPI_BUS3_GPIO_Init_Callback);
    return WHT_SPI_BUS3 == (void*)0 ? -1 : 0;
}
char WHT_SPI_BUS4_Init(void)
{
    WHT_SPI_BUS4 = WHT_SPI_BUS_OPS.Register(WHT_SPI4_Name, (WHT_SPI_BUS_Config_t*)&WHT_SPI_BUS_Config, WHT_SPI_BUS4_GPIO_Init_Callback);
    return WHT_SPI_BUS4 == (void*)0 ? -1 : 0;
}
char WHT_SPI_BUS5_Init(void)
{
    WHT_SPI_BUS5 = WHT_SPI_BUS_OPS.Register(WHT_SPI5_Name, (WHT_SPI_BUS_Config_t*)&WHT_SPI_BUS_Config, WHT_SPI_BUS5_GPIO_Init_Callback);
	return WHT_SPI_BUS5 == (void*)0 ? -1 : 0;
}
char WHT_SPI_BUS6_Init(void)
{
    WHT_SPI_BUS6 = WHT_SPI_BUS_OPS.Register(WHT_SPI6_Name, (WHT_SPI_BUS_Config_t*)&WHT_SPI_BUS_Config, WHT_SPI_BUS6_GPIO_Init_Callback);
    return WHT_SPI_BUS6 == (void*)0 ? -1 : 0;
}
